x11: Unset GdkX11DeviceXI2 scroll valuators on device change
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 27 Sep 2013 17:32:54 +0000 (19:32 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 22 Nov 2013 11:49:32 +0000 (12:49 +0100)
Scroll valuators were being just appended again and again, leading
to 1) a growing memory issue anytime a device changed 2) the first
scroll valuators to stay permanent on the application lifetime, as
the first stored valuators would always match.

https://bugzilla.gnome.org/show_bug.cgi?id=705203

gdk/x11/gdkdevice-xi2.c
gdk/x11/gdkdevicemanager-xi2.c
gdk/x11/gdkprivate-x11.h

index 8245fe4cab20e188cb7b7f4a52ecf2f0df4a0ebf..b3289c0e925417cb5556cb94cf89b0ff2bd9a6be 100644 (file)
@@ -876,6 +876,14 @@ _gdk_device_xi2_reset_scroll_valuators (GdkX11DeviceXI2 *device)
     }
 }
 
+void
+_gdk_device_xi2_unset_scroll_valuators (GdkX11DeviceXI2 *device)
+{
+  if (device->scroll_valuators->len > 0)
+    g_array_remove_range (device->scroll_valuators, 0,
+                          device->scroll_valuators->len);
+}
+
 gint
 _gdk_x11_device_xi2_get_id (GdkX11DeviceXI2 *device)
 {
index 87d28100f38ad0d36c8d13922ff26e1645e71c91..b4e3c19ccae148a375f5c65274c3397dcdb33ecf 100644 (file)
@@ -765,6 +765,7 @@ handle_device_changed (GdkX11DeviceManagerXI2 *device_manager,
   if (device)
     {
       _gdk_device_reset_axes (device);
+      _gdk_device_xi2_unset_scroll_valuators ((GdkX11DeviceXI2 *) device);
       translate_device_classes (display, device, ev->classes, ev->num_classes);
 
       g_signal_emit_by_name (G_OBJECT (device), "changed");
index 543c42d0eadb17ffc4df18564c5d947d14b1d266..fcd6da42026da954313d1b9082db5a1e4ebcea93 100644 (file)
@@ -231,6 +231,8 @@ guint    _gdk_x11_device_xi2_translate_state      (XIModifierState *mods_state,
                                                    XIButtonState   *buttons_state,
                                                    XIGroupState    *group_state);
 gint     _gdk_x11_device_xi2_get_id               (GdkX11DeviceXI2 *device);
+void     _gdk_device_xi2_unset_scroll_valuators   (GdkX11DeviceXI2 *device);
+
 
 GdkDevice * _gdk_x11_device_manager_xi2_lookup    (GdkX11DeviceManagerXI2 *device_manager_xi2,
                                                    gint                    device_id);